//
//  HMEmoticonTools.swift
//  Weibo22
//
//  Created by Apple on 16/12/10.
//  Copyright © 2016年 Apple. All rights reserved.
//

import UIKit
//  每页显示20个表情
let NumberOfPage = 20
//  最近表情归档和解档路径
private let RecentEmoticonArrayPath = (NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last! as NSString).appendingPathComponent("recentEmoticonArray.archiver")
//  表情工具类
class HMEmoticonTools: NSObject {

    //  单例全局访问点
    static let sharedTools: HMEmoticonTools = HMEmoticonTools()
    
    //  构造函数私有化
    private override init() {
        super.init()
        
    }
    
    //  创建bundle对象
    lazy var emoticonBundle: Bundle = {
        //  获取bundle文件路径
        let path = Bundle.main.path(forResource: "Emoticons.bundle", ofType: nil)!
        
        //  根据路径创建bundle对象
        let bundle = Bundle(path: path)!
        
        return  bundle
    }()
    
    
    //  最近表情
    private lazy var recentEmoticonArray: [HMEmoticon] = {
    
        if let localArray = self.loadRecentEmoticonArray() {
            //  本地有最近表情
            return localArray
        } else {
            //  本地没有最近表情
            let array = [HMEmoticon]()
            return array
        }
        
      
        
    }()
    
    
    //  默认表情
    private lazy var defaultEmoticonArray: [HMEmoticon] = {
        
        return self.loadEmoticonArray(folderName: "default", fileName: "info.plist")
        
    
    }()
    
    //  emoji表情
    private lazy var emojiEmoticonArray: [HMEmoticon] = {
       return self.loadEmoticonArray(folderName: "emoji", fileName: "info.plist")
        
    }()
    
    //  浪小花表情
    private lazy var lxhEmoticonArray: [HMEmoticon] = {
        return self.loadEmoticonArray(folderName: "lxh", fileName: "info.plist")
        
    }()
    
    //  表情视图需要的数据
    lazy var allEmoticonArray: [[[HMEmoticon]]] = {
    
        return [
            //  放入每种表情(对应的都是一个二维数组)
            [self.recentEmoticonArray],
            self.sectionEmoticonArray(emoticonArray: self.defaultEmoticonArray),
            self.sectionEmoticonArray(emoticonArray: self.emojiEmoticonArray),
            self.sectionEmoticonArray(emoticonArray: self.lxhEmoticonArray),
        ]
        
        
    }()
    
    
    //  根据表情对应的文件夹名和文件名读取表情数据
    private func loadEmoticonArray(folderName: String, fileName: String) -> [HMEmoticon] {
        //  表情子路径
        let subPath = folderName + "/" + fileName
        
        //  获取plist文件的路径
        let path = self.emoticonBundle.path(forResource: subPath, ofType: nil)!
        //  加载plist文件数据
        let dicArray = NSArray(contentsOfFile: path) as! [[String: Any]]
        //  通过YYModel把数组字典转成数组模型
        let modelArray = NSArray.yy_modelArray(with: HMEmoticon.self, json: dicArray) as! [HMEmoticon]
        
        for model in modelArray {
            if model.type == "0" {
                //  表情图片表情,需要拼接bundle文件的路径
                
                let folderNamePath = emoticonBundle.path(forResource: folderName, ofType: nil)!
                //  获取图片名字
                let png = model.png!
                
                //  拼接路径
                let path = folderNamePath + "/" + png
                //  设置图片的全路径和对应的文件夹名字
                model.path = path
                model.folderName = folderName
            }
        
        }
        
        
        
        return modelArray
        
    
    }
    
    //  根据每种表情拆分成对应的二维数组(因为每页显示20表情, 每种表情显示多少页)
    
    private func sectionEmoticonArray(emoticonArray: [HMEmoticon]) -> [[HMEmoticon]] {
        //   根据每种表情的个数计算显示的页数
        let pageCount = (emoticonArray.count - 1) / 20 + 1
        
        var tempArray = [[HMEmoticon]]()
        //  遍历页数截取对应的表情数据
        for i in 0..<pageCount {
            //  开始截取的索引
            let loc = i * NumberOfPage
            //  截取的长度
            var len = NumberOfPage
            
            if loc + len > emoticonArray.count {
                //  如果范围超出,截取剩余元素的个数
                len = emoticonArray.count - loc
            }
            
            //  根据范围截取的子数组
            let subArray = (emoticonArray as NSArray).subarray(with: NSMakeRange(loc, len)) as! [HMEmoticon]
            tempArray.append(subArray)
            
        }
        
        return tempArray
        
    }
    
    
    //  根据点击的表情,保存到最近表情数组里面
    func saveRecentEmoticonArray(emoticon: HMEmoticon) {
    
        //  1. 判断这个表情在最近表情里面是否存在,如果存在删除已有的表情
        for (i,currentEmoticon) in recentEmoticonArray.enumerated() {
         
            if emoticon.type == "0" {
                //  表示图片
                if currentEmoticon.chs == emoticon.chs {
                    //  删除指定元素
                    recentEmoticonArray.remove(at: i)
                }
            } else {
                //  表示emoji
                if currentEmoticon.code == emoticon.code {
                    //  删除指定元素
                    recentEmoticonArray.remove(at: i)
                }
            
            }
            
            
        }
        
        
        
        
        //  2. 把点击的表情添加到最近表情的第一个元素
        recentEmoticonArray.insert(emoticon, at: 0)
        
        //  3. 超过20个表情元素,删除最后一个表情
        while recentEmoticonArray.count > 20 {
            //  删除最后一个表情
            recentEmoticonArray.removeLast()
        }
        
        
        
        //  4. 更新表情数据源(三维数组)把最近标题改成最近添加后的最近表情这组数据
        allEmoticonArray[0][0] = recentEmoticonArray
        
        
        
        //  5. 把最近表情归档到指定的沙盒路径
        
        
        print(RecentEmoticonArrayPath)
        
        //  归档数据
        NSKeyedArchiver.archiveRootObject(recentEmoticonArray, toFile: RecentEmoticonArrayPath)
        
    
        
        
    }
    
    //  读取最近表情数据
    private func loadRecentEmoticonArray() -> [HMEmoticon]? {
        
        let localArray = NSKeyedUnarchiver.unarchiveObject(withFile: RecentEmoticonArrayPath) as? [HMEmoticon]
        
        return localArray
        
        
    }
    
    //  根据表情描述查找表情模型
    func selectEmoticon(chs: String) -> HMEmoticon? {
        
        //  表情图片模型
        
        for emoticon in defaultEmoticonArray {
            if emoticon.chs == chs {
                //  默认表情 表情描述相同,返回对应的表情模型
                return emoticon
            }
        }
        
        for emoticon in lxhEmoticonArray {
            if emoticon.chs == chs {
                //  浪小花表情 表情描述相同,返回对应的表情模型
                return emoticon
            }
        }
        
        
        return nil
        
        
        
        
    }
    
    
    
    
    
    
    
}
